/* The file is saved in UTF-8 codepage.
 * Check: «Stereotype», Section mark-§, Copyright-©, Alpha-α, Beta-β, Smile-☺
 */
package cz.pecinovsky.english.lootp._125_;



////////////////////////////////////////////////////////////////////////////////
//%%+  +++++ End of ignored starting test - place for imports +++++
//%A+ >=133z

import cz.pecinovsky.english.lootp.utility.IO;
//%A-
//%X+ xxxxx Start of the ovejumped text with declaration of the envelope xxxxx
/*******************************************************************************
 *<pre>
 * Předchozí:   Není - toto_je_nově_definovaná_třída
 *              Ttt v projektu Ppp
 * Následující: Prozatím není
 *
 * Projekt  Ppp
 *   + Přidáno
 *   - Odebráno
 *   ~ Změněno
 *</pre>
 */
public class KTI_130_
{    private KTI_130_() {}   static
////////////////////////////////////////////////////////////////////////////////
//%X- ----- End of the ovejumped text with declaration of the envelope -----


/*******************************************************************************
 * Třída {@code CCI} a její instance slouží pro demonstrace a experimenty
 * Construction of classes and instances
 * při výkladu zavádění a inicializací tříd a konstrukci jejích instancí.
 *
 * @author Rudolf PECINOVSKÝ
 * @version 6.03.2017 — 2010-11-08
 */
public class CCI
{
    static  //Úvodní statický inicializační blok
    {/*## 1 ##*/
        IO.inform("Konstruktor třídy KTI\n\nSTART");
        tiskniStatickéAtributy("Konstrukce třídy KTI - START");
    }

    //Úvodní instanční inicializační blok
    {/*## 2 ##*/
        IO.inform("Inicializace instance KTI\n\nSTART");
        System.out.println("\n-------------------------------------" +
                           "\nSTART inicializace pro " + this);
    }


//== CONSTANT CLASS ATTRIBUTES =================================================

    static  //Před deklarací konstant
    {/*## 3 ##*/
        //Použití nedeklarované konstanty je syntaktická chyba,
        //i kdyby už měla přiřazenou hodnotu při překladu
//        System.out.println("COMPILED:    " + COMPILED);

        //Skryté použití ale projde - viz tisk v úvodním bloku
    }

    //Konstanta inicializovaná v době překladu - je-li hodnota konstanty
    //známa v době překladu, inicializuje ji už překladač
    private static final String COMPILED = "COMPILED";

    //Konstanta inicializovaná až při zavádění třídy
    public static final Class CLASS_OBJECT = CCI.class;

    //Konstanta inicializovaná až při zavádění třídy
    public static final String INITIALIZED;

    static  //Po deklaraci konstant
    {/*## 4 ##*/
//        //Dosud neinicializovaná konstanta se také nesmí používat
//        System.out.println("INITIALIZED: " + INITIALIZED);

        INITIALIZED = CLASS_OBJECT.getName();

        //Po inicializaci se konstanty již smí používat
        System.out.println("\nxxx Tisk po inicializaci třídních konstant:" +
                           "\n    - COMPILED:     " + COMPILED +
                           "\n    - CLASS_OBJECT: " + CLASS_OBJECT +
                           "\n    - INITIALIZED:  " + INITIALIZED);
    }

    //Atributem třídy může být i instance dané třídy. Je však třeba dbát na to,
    //aby byl tento atribut inicializován až po všech atributech třídy,
    //které jsou při jeho inicializaci používány.
    //Následující deklarace má problém s konstatním atributem LOADED
    //stejně jako s proměnným atributem countCreated.
    //Problémy se odstraní přemístěním jeho inicializace
    //za všechny atributy inicializace atributů třídy.
//    public static final CCI JÁ = new CCI();



//== VARIABLE CLASS ATTRIBUTES =================================================

    static //Před deklarací proměnných
    {/*## 5 ##*/
//        //Nedeklarovaná variable se také nesmí používat
//        System.out.println("variable: " + variable);
    }

    private static String variable;
    private static int    countCreated = 0;

    static  //Po deklaraci proměnných
    {/*## 6 ##*/
        //Proměnná se smí používat i neinicializovaná
        System.out.println("\nxxx Tisk po deklaraci třídních proměnných:" +
                           "\n    - variable:    " + variable);
        variable = "VARIABLE";  //Proměnná je inicializována až teď
    }



//== STATIC CONSTRUCTOR (CLASS INITIALIZER, STATIC INICITALIZING BLOCK) ======== 
//== CONSTANT INSTANCE ATTRIBUTES ==============================================

    private final int ID;
    //"Rodné číslo" instance je nutno nejprve spočítat
    {/*## 7 ##*/
        countCreated = countCreated + 1;  //Zvětším statický atribut
        ID = countCreated;      //a zapamatuji si jeho aktuální hodnotu
        System.out.println("Atribut ID inicializován: " + this);
    }


//== VARIABLE INSTANCE ATTRIBUTES ==============================================

    //V inicializaci instančních atributů se smí používat pouze
    //dříve deklarované instanční atributy a již inicializované konstanty
    //Atributy třídy se však smí používat všechny, protože ty mají být
    //v době inicializace instance už dávno připraveny
    private String time = LOADED;

    //V inicializaci instance je povoleno použití parametru this
    //V následující inicializaci se ptám instance na její class-objekt
    String name = "[" + this.getClass() + "]";    //Prozatímní name

    String source;



//== CLASS GETTERS AND SETTERS =================================================
//== OTHER NON-PRIVATE CLASS METHODS ===========================================

    /***************************************************************************
     * Vytiskne na standardní výstup všechny statické atributy třídy
     *
     * @param nadpis Nadpis před jednotlivými tisky
     */
    public static void tiskniStatickéAtributy(String nadpis)
    {
        System.out.println("\n" + nadpis +
                           "\n  - COMPILED=" + COMPILED +
                              ",  CLASS_OBJECT=" + CLASS_OBJECT +
                              ",  variable=" + variable +
                              ",  countCreated=" + countCreated +
                           "\n    LOADED=" + LOADED
                        );
    }



//##############################################################################
//== CONSTUCTORS AND FACTORY METHODS ===========================================

    /***************************************************************************
     * Bezparametrický konstruktor pro test inicializace.
     */
    public CCI()
    {
        System.out.println("Vstup do těla konstruktoru " + this);
        source = "Parametereless";
        System.out.println("Konec těla konstruktoru " + this);
    }


    /***************************************************************************
     * Jednoparametrický konstruktor pro test delegace zodpovědnosti.
     *
     * @param name Název vytvářené instance
     */
    public CCI(String name)
    {
//        //Před předáním odpovědnosti nesmí nic být
//        System.out.println("1-parametrický pro " + this);
        this(name, prepare("1-parameter"));
        System.out.println("END 1-parameter");
    }


    /***************************************************************************
     * Dvouparametrický konstruktor pro test delegace zodpovědnosti.
     *
     * @param name Název vytvářené instance
     * @param source Charakteristika  žadatele
     */
    public CCI(String name, String source)
    {
        this(name, prepare("2-param"), source);
        String local = "2-parameters";
        System.out.println("END " + local);
    }


    /***************************************************************************
     * Tříparametrický konstruktor pro test delegace zodpovědnosti.
     *
     * @param name Název vytvářené instance
     * @param source Charakteristika  žadatele
     * @param prazdroj Druhá část hodnoty atributu {@code source}
     */
    public CCI(String name, String source, String prazdroj)
    {
        System.out.println("Vstup do těla 3-parametrického pro " + this +
        "\n   Název=" + name + ", Zdroj=" + source + ", prazdroj=" + prazdroj);
        String nepoužitá;
        String podtržení;
        this.name     = name;
        String součet = "«" + prazdroj + " -> " + source + "»";
        this.source   = součet;
        String local  = "END 3-parameters: ";
        podtržení = "\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~";
        System.out.println(local + this + podtržení);
    }



//== ABSTRACT METHODS ==========================================================
//== INSTANCE GETTERS AND SETTERS ==============================================
//== OTHER NON-PRIVATE INSTANCE METHODS ========================================

    /** Vrátí popis instance. */
    @Override
    public String toString()
    {
        return "KTI_" + ID + "(name=" + name + ", source=" + source +
               ", ##time=" + time + ")";
    }



//== PRIVATE AND AUXILIARY CLASS METHODS =======================================

    /***************************************************************************
     * Pomocná statická metoda sloužící k zaznamenání okamžiku,
     * kdy se vyhodnocují parametry.
     *
     * @param nadpis Nadpis před jednotlivými tisky
     */
    private static String prepare(String text)
    {
        System.out.println("  === Přípravuji: " + text);
        return text;
    }



//== PRIVATE AND AUXILIARY INSTANCE METHODS ====================================
//== EMBEDDED TYPES AND INNER CLASSES ==========================================
//== TESTING CLASSES AND METHODS ===============================================
//
//    /***************************************************************************
//     * Test method.
//     */
//    public static void test()
//    {
//        CCI inst = new CCI();
//    }
//    /** @param args Parametry příkazového řádku - nepoužívané. */
//    public static void main(String[] args)  {  test();  }

    {/*## 8 ##*/
        System.out.println("STOP inicializace instance " + this +
                         "\n----------------------------");
        IO.inform("Konec inicializační části instance");
    }

    //Statický atribut deklarovaný až na konci těla
    private static final String LOADED = "" + new java.util.Date();
    static
    {/*## 9 ##*/
        tiskniStatickéAtributy("\nKonstrukce třídy KTI - STOP");
        System.out.println("=============================\n");
        IO.inform("Zavírá se konstruktor třídy KTI");
    }
    }

//%%- ---- Start of the ovejumped text with closing of the envelope ----
////////////////////////////////////////////////////////////////////////////////
//== TESTING CLASSES AND METHODS ===============================================

    /***************************************************************************
     * Test method.
     */
    public static void test()
    {
        new CCI("pokus");
        System.exit(0);
    }
    /** @param args Parametry příkazového řádku - nepoužívané. */
    public static void main(String[] args)  {  test();  }
}
